/*
实验15-3 拼题A打卡奖励
分数 35
作者 陈越
单位 浙江大学

拼题 A 的教超搞打卡活动，指定了 N 张打卡卷，第 i 张打卡卷需要 mi​ 分钟做完，完成后可获得 ci​ 枚奖励的金币。活动规定每张打卡卷最多只能做一次，并且不允许提前交卷。活动总时长为 M 分钟。请你算出最多可以赢得多少枚金币？
输入格式：

输入首先在第一行中给出两个正整数 N（≤10^3） 和 M（≤365×24×60），分别对应打卡卷的数量和以“分钟”为单位的活动总时长（不超过一年）。随后一行给出 N 张打卡卷要花费的时间 mi​（≤600），最后一行给出 N 张打卡卷对应的奖励金币数量 ci​（≤30）。上述均为正整数，一行内的数字以空格分隔。
输出格式：

在一行中输出最多可以赢得的金币数量。
输入样例：

5 110
70 10 20 50 60
28 1 6 18 22

输出样例：

40

样例解释：

选择最后两张卷子，可以在 50+60=110 分钟内获得 18+22=40 枚金币。

*/

/*
方法思路

该问题本质上是0-1背包问题，但由于直接使用传统方法处理大时间范围会导致超时，因此我们转换思路，
将金币作为状态值，计算获得特定金币所需的最小时间。具体步骤如下：

    状态定义：使用数组 dp[j] 表示获得 j 枚金币所需的最小时间。

    状态转移：对于每个打卡卷，逆序更新 dp 数组，确保每个金币数的时间最小。

    结果查询：遍历所有可能的金币数，找到满足时间约束的最大金币数。
*/

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

using namespace std;

const long long INF = 1e18;

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> mi(N), ci(N);
    for (int i = 0; i < N; ++i) cin >> mi[i];
    for (int i = 0; i < N; ++i) cin >> ci[i];
    
    // 计算所有金币 ci 的总和，目的是确定动态规划数组 dp 的上限（最大可能的金币数）
    int sum_ci = accumulate(ci.begin(), ci.end(), 0);
    vector<long long> dp(sum_ci + 1, INF);
    dp[0] = 0;  // 初始状态：0金币需要0分钟
    
    for (int i = 0; i < N; ++i) {
        int c = ci[i], m = mi[i];
        for (int j = sum_ci; j >= c; --j) {
            if (dp[j - c] + m < dp[j]) {
                dp[j] = dp[j - c] + m;
            }
        }
    }
    
    int ans = 0;
    for (int j = sum_ci; j >= 0; --j) {
        if (dp[j] <= M) {
            ans = j;
            break;
        }
    }
    
    cout << ans << endl;
    
    return 0;
}